#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "ExtremeC_examples_chapter8_4_animal.h"
#include "ExtremeC_examples_chapter8_4_animal_p.h"

typedef struct
{
    animal_t animal;
} duck_t;

// 为 duck 的声音定义一个新的行为
void __duck_sound(void *ptr)
{
    animal_t *animal = (animal_t *)ptr;
    printf("%s : Quacks\n", animal->name);
}

// 分配内存函数
duck_t *duck_new()
{
    return (duck_t *)malloc(sizeof(duck_t));
}

// 构造函数
void duck_ctor(duck_t *duck)
{
    animal_ctor((struct animal_t *)duck);
    strcpy(duck->animal.name, "Duck");
    // 指向新的行为函数，实际这里发生了重载
    duck->animal.sound_func = __duck_sound;
}

// 析构函数
void duck_dtor(duck_t *duck)
{
    animal_dtor((struct animal_t *)duck);
}